{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "b760a0f6",
   "metadata": {},
   "source": [
    "# Linear Regression\n",
    "\n",
    "Currently, **Concrete** only supports unsigned integers up to 7-bits. Nevertheless, we want to evaluate a linear regression model with it. Luckily, we can make use of **quantization** to overcome this limitation."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "253288cf",
   "metadata": {},
   "source": [
    "### Let's start by importing some libraries to develop our linear regression model."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "6200ab62",
   "metadata": {},
   "outputs": [],
   "source": [
    "from copy import deepcopy\n",
    "from typing import Any, Dict\n",
    "\n",
    "import numpy as np\n",
    "from matplotlib import pyplot as plt\n",
    "from sklearn.datasets import make_regression\n",
    "from sklearn.linear_model import LinearRegression\n",
    "from sklearn.metrics import r2_score\n",
    "from sklearn.model_selection import train_test_split\n",
    "from tqdm import tqdm\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c8160548",
   "metadata": {},
   "source": [
    "\n",
    "\n",
    "### Now, import Concrete quantization tools. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "9dc823e0",
   "metadata": {},
   "outputs": [],
   "source": [
    "from concrete.quantization import QuantizedArray, QuantizedLinear, QuantizedModule"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f43e2387",
   "metadata": {},
   "source": [
    "### And some helpers for visualization."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "d104c8df",
   "metadata": {},
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "from IPython.display import display"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4a5ae7af",
   "metadata": {},
   "source": [
    "### And, finally, the FHE compiler."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "05cda814",
   "metadata": {},
   "outputs": [],
   "source": [
    "import concrete.numpy as hnp"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "53e676b8",
   "metadata": {},
   "source": [
    "### Let's define our Quantized Linear Regression module that quantizes a sklearn linear regression."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "d451e829",
   "metadata": {},
   "outputs": [],
   "source": [
    "class QuantizedLinearRegression(QuantizedModule):\n",
    "    \"\"\"\n",
    "    Quantized Generalized Linear Model\n",
    "    Building on top of QuantizedModule, this class will chain together a linear transformation\n",
    "    and an inverse-link function\n",
    "    \"\"\"\n",
    "\n",
    "    @staticmethod\n",
    "    def from_sklearn(sklearn_model, calibration_data):\n",
    "        \"\"\"Create a Quantized Linear Regression initialized from a sklearn trained model\"\"\"\n",
    "        weights = np.expand_dims(sklearn_model.coef_, 1)\n",
    "        bias = sklearn_model.intercept_\n",
    "        #Quantize with 6 bits for input data, 1 for weights, 1 for the bias and 6 for the output\n",
    "        return QuantizedLinearRegression(6, 1, 1, 6, weights, bias, calibration_data)\n",
    "\n",
    "    def __init__(self, q_bits, w_bits, b_bits, out_bits, weights, bias, calibration_data) -> None:\n",
    "        \"\"\"\n",
    "        Create the Linear regression with different quantization bit precitions:\n",
    "\n",
    "        Quantization Parameters - Number of bits:\n",
    "            q_bits (int): bits for input data, insuring that the number of bits of \n",
    "                        the w . x + b operation does not exceed 7 for the calibration data\n",
    "            w_bits (int): bits for weights: in the case of a univariate regression this \n",
    "                        can be 1 \n",
    "            b_bits (int): bits for bias (this is a single value so a single bit is enough)\n",
    "            out_bits (int): bits for the result of the linear transformation (w.x + b). \n",
    "                            In our case since the result of the linear transformation is \n",
    "                            directly decripted we can use the maximum of 7 bits\n",
    "\n",
    "        Other parameters:\n",
    "            weights: a numpy nd-array of weights (Nxd) where d is the data dimensionality\n",
    "            bias: a numpy scalar\n",
    "            calibration_data: a numpy nd-array of data (Nxd)\n",
    "        \"\"\"\n",
    "        self.n_bits = out_bits\n",
    "\n",
    "        # We need to calibrate to a sufficiently low number of bits\n",
    "        # so that the output of the Linear layer (w . x + b)\n",
    "        # does not exceed 7 bits\n",
    "        self.q_calibration_data = QuantizedArray(q_bits, calibration_data)\n",
    "\n",
    "        # Quantize the weights and create the quantized linear layer\n",
    "        q_weights = QuantizedArray(w_bits, weights)\n",
    "        q_bias = QuantizedArray(b_bits, bias)\n",
    "        q_layer = QuantizedLinear(out_bits, q_weights, q_bias)\n",
    "\n",
    "        # Store quantized layers\n",
    "        quant_layers_dict: Dict[str, Any] = {}\n",
    "\n",
    "        # Calibrate the linear layer and obtain calibration_data for the next layers\n",
    "        calibration_data = self._calibrate_and_store_layers_activation(\n",
    "            \"linear\", q_layer, calibration_data, quant_layers_dict\n",
    "        )\n",
    "\n",
    "        # Finally construct our Module using the quantized layers\n",
    "        super().__init__(quant_layers_dict)\n",
    "\n",
    "    def _calibrate_and_store_layers_activation(\n",
    "        self, name, q_function, calibration_data, quant_layers_dict\n",
    "    ):\n",
    "        \"\"\"\n",
    "        This function calibrates a layer of a quantized module (e.g. linear, inverse-link,\n",
    "        activation, etc) by looking at the input data, then computes the output of the quantized\n",
    "        version of the layer to be used as input to the following layers\n",
    "        \"\"\"\n",
    "\n",
    "        # Calibrate the output of the layer\n",
    "        q_function.calibrate(calibration_data)\n",
    "        # Store the learned quantized layer\n",
    "        quant_layers_dict[name] = q_function\n",
    "        # Create new calibration data (output of the previous layer)\n",
    "        q_calibration_data = QuantizedArray(self.n_bits, calibration_data)\n",
    "        # Dequantize to have the value in clear and ready for next calibration\n",
    "        return q_function(q_calibration_data).dequant()\n",
    "\n",
    "    def quantize_input(self, x):\n",
    "        \"\"\"Quantize an input set with the quantization parameters determined from calibration\"\"\"\n",
    "        q_input_arr = deepcopy(self.q_calibration_data)\n",
    "        q_input_arr.update_values(x)\n",
    "        return q_input_arr"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7945595f",
   "metadata": {},
   "source": [
    "### Create a synthetic dataset"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "410b90de",
   "metadata": {},
   "outputs": [],
   "source": [
    "\n",
    "X, y = make_regression(\n",
    "    n_samples=200, n_features=1, n_targets=1, bias=5.0, noise=30.0, random_state=42\n",
    ")\n",
    "\n",
    "# Split it into train/test and sort the sets for nicer visualization\n",
    "x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state=42)\n",
    "\n",
    "sidx = np.argsort(np.squeeze(x_train))\n",
    "x_train = x_train[sidx, :]\n",
    "y_train = y_train[sidx]\n",
    "\n",
    "sidx = np.argsort(np.squeeze(x_test))\n",
    "x_test = x_test[sidx, :]\n",
    "y_test = y_test[sidx]\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "75f4fdb7",
   "metadata": {},
   "source": [
    "### Train a linear regression on the training set and visualize predictions on the test set."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "2a124a62",
   "metadata": {},
   "outputs": [],
   "source": [
    "linreg = LinearRegression()\n",
    "linreg.fit(x_train, y_train)\n",
    "\n",
    "y_pred = linreg.predict(x_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a0ba5509",
   "metadata": {},
   "source": [
    "### Visualize the regression line and the data set."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "edcd361b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAs4AAAHSCAYAAAD8EE1RAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAABx/0lEQVR4nO3deXjU5bnG8e9AAhgRwuYGVkAgshi2AKKoqCyiFhUXoFDXigtIiCvBhZFiQq0aYsEq1rpUq9ZWxaUgRUtRETGCRgQRE2yBg4hIRIxAIL/zx8svmZnMvk9yf64rV5j9ncSec8+b530eh2VZFiIiIiIi4lejRC9ARERERCQVKDiLiIiIiARBwVlEREREJAgKziIiIiIiQVBwFhEREREJgoKziIiIiEgQ0hK9gGC0bduWjh07JnoZIiIiIlLPff3113z33Xdeb0uJ4NyxY0dKSkoSvQwRERERqedycnJ83qZSDRERERGRICg4i4iIiIgEQcFZRERERCQIKVHj7E1VVRVbtmxh7969iV6KJFizZs3o0KED6enpiV6KiIiI1GMpG5y3bNnCEUccQceOHXE4HIlejiSIZVns3LmTLVu20KlTp0QvR0REROqxlC3V2Lt3L23atFFobuAcDgdt2rTRXx5EREQk5lI2OAMKzQLovwMRERGJj5QOzol233330bNnT7Kzs+nTpw8ffvghYPpOe2uc3bx587iu76mnnqJdu3b06dOHE088kaKiori+fiCnnHJKopcgIiIiErSUrXFOtA8++IA33niD1atX07RpU7777jv2798fl9c+ePAgjRs3Duq+Y8eOZd68eezcuZOsrCwuueQSjjvuuIhe/8CBA6SlRf6fzooVKyJ+DhEREZF40Y5zmLZt20bbtm1p2rQpYMaCH3vssW73+fnnnxk1ahSPP/54ncf//ve/Z8CAAWRnZzNz5sya6y+88EL69+9Pz549WbBgQc31zZs355ZbbqF379588MEHNG/enDvvvJPevXtz8skns337dr/rbdOmDV26dGHbtm0APPvsswwcOJA+ffpw3XXXcfDgQQCeeOIJunXrxsCBA7n22muZMmUKAFdeeSXXX389gwYN4vbbb6esrIxzzjmH/v37c9ppp/HFF18A8NJLL9GrVy969+7N6aefDsDnn39e81rZ2dls3Lix5j2BOeB322230atXL0466SRefPFFAJYtW8bQoUO55JJLOPHEE5kwYQKWZQXz6xERERGJunqz4zx0aN3rLrsMbrwRKivh3HPr3n7llebru+/gkkvcb1u2zP/rjRgxglmzZtGtWzeGDRvG2LFjOeOMM2pu37NnD+PGjePyyy/n8ssvd3vskiVL2LhxI6tWrcKyLEaPHs3y5cs5/fTT+fOf/0zr1q35+eefGTBgABdffDFt2rThp59+YtCgQTz44IMA/PTTT5x88sncd9993H777Tz++OPcddddPtf7v//9j71795Kdnc369et58cUXef/990lPT+fGG2/kueeeY9iwYfz2t79l9erVHHHEEZx11ln07t275jm2bNnCihUraNy4MWeffTaPPvooXbt25cMPP+TGG2/knXfeYdasWbz11lu0b9+eiooKAB599FFyc3OZMGEC+/fvrwnptpdffplPPvmETz/9lO+++44BAwbUhO41a9bw+eefc+yxx3Lqqafy/vvvM2TIEP+/HBEREZEY0I5zmJo3b87HH3/MggULaNeuHWPHjuWpp56quf2CCy7gqquuqhOawQTnJUuW0LdvX/r168cXX3xRswv78MMP1+wib968ueb6xo0bc/HFF9c8R5MmTTj//PMB6N+/P19//bXXdb744otkZ2fTpUsXbrzxRpo1a8bbb7/Nxx9/zIABA+jTpw9vv/025eXlrFq1ijPOOIPWrVuTnp7OpZde6vZcl156KY0bN2bPnj2sWLGCSy+9tGbH2t7JPvXUU7nyyit5/PHHawLy4MGDKSgo4He/+x3//e9/Oeyww9ye97333mP8+PE0btyYo446ijPOOIOPPvoIgIEDB9KhQwcaNWpEnz59fL5PERERkVirNzvO/naIMzL83962beAdZm8aN27M0KFDGTp0KCeddBJPP/00V155JWAC5OLFi/nVr35Vp+uDZVnk5+dz3XXXebyHZSxdupQPPviAjIwMhg4dWtNmrVmzZm51zenp6TXP27hxYw4cOOB1jXaNc0lJCSNGjGD06NFYlsUVV1xBYWGh231fffVVv+/38MMPB6C6uprMzEw++eSTOvd59NFH+fDDD3nzzTfp378/H3/8Mb/61a8YNGgQb775Jueeey6PPfYYZ511lt/XstmlMIHep4iIiEisacc5TBs2bKjZDQb45JNPOP7442suz5o1i1atWjF58uQ6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nWDxYhg50uMOvnb+IWl2/hWcRURERCQmLAu+/BKysiAnB554AsaN890qONl3/htUjbOIiIiIxMfXX8N550HfvvDf/5rse/XVfkKzLYl3/hWcw7Rz50769OlDnz59OProo2nfvn3N5f379wd8/LJly1ixYkVQr9WxY0e+++47v/cpKCgI6rlEREREYunAAVO73LMnLF9uWgJ36JDoVUVHwynVcN3293Y5RG3atOGTTz4BzBCS5s2bc+uttwb9+GXLltG8eXNOOeWUsNfgqqCggBkzZkTluURERETCsW8fDBkCJSVw/vkwfz784heJXlX0NIwd51KneyuTGI1v/PjjjznjjDPo378/I0eOZNu2bQA8/PDD9OjRg+zsbMaNG8fXX3/No48+SlFRUc1kP1c7d+5kxIgR9OzZk9/85je4zqi58MIL6d+/Pz179mTBggUATJ8+nZ9//pk+ffowYcIEn/cTERERiQV7QHLTpnDuufDSS/Daa/UrNENDmBzor7VJlCbROJ1ODj/8cF555RUWLlxIu3btePHFF3nrrbf485//zLHHHsumTZto2rQpFRUVZGZm+t2lnjp1Km3btuWee+7hzTff5Pzzz2fHjh20bduW77//ntatW/Pzzz8zYMAA/vOf/9CmTRuaN2/Onj17ap7D1/3qK00OFBERSYxFi2DKFHj2WRg8ONGriZy/yYH1v1TDtZXJhuLaXoBRHt+4b98+1q5dy/DhwwE4ePAgxxxzDADZ2dlMmDCBCy+8kAsvvDDgcy1fvpyXX34ZgPPOO49WrVrV3Pbwww/zyiuvALB582Y2btzoNRAHez8RERGRcGzfDtOmwQsvQPfu0LhxolcUe/U/OENteHadPx/l1iaWZdGzZ08++OCDOre9+eabLF++nNdff5377ruPzz77LKzXWLZsGUuXLuWDDz4gIyODoUOHsnfv3rDvJyIiIhKOZ56B3FyorIRZs+D2202ZRn3XMGqc4zC+sWnTpuzYsaMmOFdVVfH5559TXV3N5s2bOfPMM/nd737HDz/8wJ49ezjiiCP48ccfvT7X6aefzl//+lcAFi1axK5duwD44YcfaNWqFRkZGXzxxResXLmy5jHp6elUVVUFvJ+IiIhIpLZvNyOzS0vh7rsbRmiGhhCcPWucx1eb7xuKoxqeGzVqxN///nfuuOMOevfuTZ8+fVixYgUH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dnQiIlKvde5sQqx7GUWtjAyH++G2CNue5eebA3WhhGYwlxO18zxnjgn7559vBppcf73v0AzBh+ZUPRApEg4FZxERqRc8yyhssdrl9XcQMFlau+3eDV9+af49dSq8/jq89BIce2x0nj8Z67dFYknBWURE6o1Qa5BjIfDud3xau736KvToAZdeaoaYtGxpdpujJRnrt0ViTcFZRETqlWQ43Bbv3W9XW7fCmDGmtVybNrBggf+SjHDU7V6i8CwNg/o4i4hIvZOfD2PHJvZwmx2O7YAZj9C8ZrXFGUMdVFWZmuab8yzSm0R3jHWg+m1QJw6pv7TjLCIi9VIydISI1+73zz8DpU56Vd3CrydarF0Ld9xukf5ZHpQ6o/Y6yVS/LZIICs4iIiIxFKgDRyT27jWBPCvLYtfOfaSXFTH/mjxO6GyZAS8biqGqIqRBL/4kS/22SKJEJThfffXVHHnkkfTq1avmuu+//57hw4fTtWtXhg8fzq5duwCwLIupU6fSpUsXsrOzWb16dTSWICIikrRiEST//W/Izob77oOzznJA74LaqYjPN6qdlhjCaPFgJLJ+WyTRohKcr7zyShYvXux23Zw5czj77LPZuHEjZ599NnPmzAFg0aJFbNy4kY0bN7JgwQJuuOGGaCxBRESkQdi3D666Cs46y2wkL10KTz0FrVofmoroKsqh2ZYM3UtEEiEqwfn000+ndevWbtctXLiQK664AoArrriCV199teb6yy+/HIfDwcknn0xFRQXbtm2LxjJERERiw7PUIYFDd5s0gYoKU0tcWgpnn+2yptV57ndenReztSZD9xKReItZjfP27ds55phjADj66KPZvn07AFu3buW4446ruV+HDh3YunVrrJYhIiISmdKZ7gG0utpcLnXGbQnl5XDBBbBpk9lAfvllU6Jx2GGH7mC51DRn5cL46tqyjRiH51jVb4sko7i0o3M4HDhC/FPRggULWLBgAQA7duyIxbJERET8+3Qm/N9rsOsTc7nvQ/BWf3M5K9cE0hiUQtiqqqCoCJxOSEuDtWuhUycvL+lwQHqme02zXbaRnhnTNeogoDQkMQvORx11FNu2beOYY45h27ZtHHnkkQC0b9+ezZs319xvy5YttG/fvs7jJ02axKRJkwDIycmJ1TJFRES8syw48IMJya36mN3bDcXmtlZ9TIiOYSBdtQquvdaU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",
      "text/plain": [
       "<Figure size 864x576 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.ioff()\n",
    "\n",
    "plt.clf()\n",
    "fig, ax = plt.subplots(1, figsize=(12,8))\n",
    "fig.patch.set_facecolor(\"white\")\n",
    "ax.scatter(x_train, y_train, c=\"blue\", marker=\"D\", label=\"Train data\")\n",
    "ax.scatter(x_test, y_test, c=\"orange\", marker=\"x\", label=\"Test data\")\n",
    "ax.plot(x_test, y_pred, c=\"blue\", marker=None, linestyle=\"dashed\", label=\"Sklearn Regression\")\n",
    "ax.legend()\n",
    "display(fig)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "996fbe05",
   "metadata": {},
   "source": [
    "### Calibrate the model for quantization using both training and test data\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "06ed91dd",
   "metadata": {},
   "outputs": [],
   "source": [
    "calib_data = X  \n",
    "q_linreg = QuantizedLinearRegression.from_sklearn(linreg, calib_data)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cd74c5e7",
   "metadata": {},
   "source": [
    "### Now, we can compile our model to FHE, taking as the possible input set all of our dataset."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "b8f8f95b",
   "metadata": {},
   "outputs": [],
   "source": [
    "X_q = q_linreg.quantize_input(X)\n",
    "\n",
    "engine = q_linreg.compile(X_q)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "084fb296",
   "metadata": {},
   "source": [
    "### Time to make some predictions, first in the clear."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "e781279a",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Now that the model is quantized, predict on the test set\n",
    "x_test_q = q_linreg.quantize_input(x_test)\n",
    "q_y_pred = q_linreg.forward_and_dequant(x_test_q)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f28155cf",
   "metadata": {},
   "source": [
    "### Now let's predict using the quantized FHE classifier."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "2b6da1f6",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 80/80 [00:14<00:00,  5.57it/s]\n"
     ]
    }
   ],
   "source": [
    "# Now predict using the FHE quantized model on the testing set\n",
    "y_test_pred_fhe = np.zeros_like(x_test)\n",
    "\n",
    "for i, x_i in enumerate(tqdm(x_test_q.qvalues)):\n",
    "    q_sample = np.expand_dims(x_i, 1).transpose([1, 0]).astype(np.uint8)\n",
    "    # bench: Measure: Evaluation Time (ms)\n",
    "    q_pred_fhe = engine.run(q_sample)\n",
    "    y_test_pred_fhe[i] = q_linreg.dequantize_output(q_pred_fhe)\n",
    "    # bench: Measure: End\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "23852861",
   "metadata": {},
   "source": [
    "### Evaluate all versions of the classifier."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "7b0f541f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Sklearn R^2: 0.8758\n",
      "Non Homomorphic R^2: 0.8735\n",
      "Homomorphic R^2: 0.8735\n",
      "Relative Difference Percentage: 0.00%\n"
     ]
    }
   ],
   "source": [
    "# Measure the error for the three versions of the classifier\n",
    "sklearn_r2 = r2_score(y_pred, y_test)\n",
    "non_homomorphic_test_error = r2_score(q_y_pred, y_test)\n",
    "homomorphic_test_error = r2_score(y_test_pred_fhe, y_test)\n",
    "\n",
    "# Measure the error of the FHE quantized model w.r.t the clear quantized model\n",
    "difference = (\n",
    "    abs(homomorphic_test_error - non_homomorphic_test_error) * 100 / non_homomorphic_test_error\n",
    ")\n",
    "\n",
    "\n",
    "print(f\"Sklearn R^2: {sklearn_r2:.4f}\")\n",
    "print(f\"Non Homomorphic R^2: {non_homomorphic_test_error:.4f}\")\n",
    "print(f\"Homomorphic R^2: {homomorphic_test_error:.4f}\")\n",
    "print(f\"Relative Difference Percentage: {difference:.2f}%\")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "704b2f63",
   "metadata": {},
   "source": [
    "### Plot the results of both the original and FHE versions of the classifier."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "aae3f6da",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAs4AAAHSCAYAAAD8EE1RAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAACPJElEQVR4nO3dd3iTZfvG8W86GGXLUAQVWWWWVYbiQpY4cP4Y4utABQGlVEUpolQEioIWFBRxIQ5wiwtEVEREZVugCNiCAoKyyqpAx/P74yZtmiZt2iZN2p6f4+hRkjxJ7if1Pd6zd6/numyWZVmIiIiIiEiegvy9ABERERGRkkDBWURERETEAwrOIiIiIiIeUHAWEREREfGAgrOIiIiIiAcUnEVEREREPBDi7wV4olatWjRo0MDfyxARERGRUm7nzp0cOHDA5WMlIjg3aNCANWvW+HsZIiIiIlLKRUZGun1MpRoiIiIiIh5QcBYRERER8YCCs4iIiIiIB0pEjbMraWlp7N69m5MnT/p7KSI+UaFCBerXr09oaKi/lyIiIiKU4OC8e/duqlSpQoMGDbDZbP5ejohXWZbFwYMH2b17NxdeeKG/lyMiIiKU4FKNkydPUrNmTYVmKZVsNhs1a9bUX1REREQCSIkNzoBCs5Rq+u9bREQksJTo4FwYycneeZ2DBw/Stm1b2rZtyznnnEO9evWybp8+fTrP565Zs4aRI0cW6P0aNGhA69atad26NS1atGDcuHH57kampKTw4osvFuh9RERERMS1MhWc4+KgUSPzvahq1qzJhg0b2LBhA/fddx/R0dFZt8uVK0d6errb50ZGRvL8888X+D2///57Nm7cyKpVq0hOTmbo0KF5Hq/gLCIiIuI9ZSY4x8XBxInm3xMneic8O7vzzju577776Ny5M4888girVq3ioosuol27dlx88cVs3boVgGXLlnHttdcCEBsby+DBg7niiito2LChR4G6cuXKzJ49m08//ZRDhw5x/PhxunfvTvv27WndujULFy4EYMyYMSQlJdG2bVtGjx7t9jgRERERyV+J7apREPbQnJpqbqemZofomBjvvtfu3btZuXIlwcHBHD16lB9//JGQkBCWLl3K2LFj+eijj3I95/fff+f777/n2LFjhIeHM2zYsHxbkFWtWpULL7yQ7du306FDBz755BOqVq3KgQMH6NKl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FhERERGfsCzYtg3CwyEyEl57DW49azEVou+HpCRz0P/+B1OnwtlnZz8pQHf+S387OhEREREpdjt3wjXXQLt28OefYNu9i8Ff3kyFG/uY0NyiBSxbBvPmZYdmCOidfwXnIti3bx8DBgygUaNGdOjQgauvvppt27axc+dOWrVq5ZP3vOKKKwgPD6dNmzZ07NiRDRs2eP097rzzTi688ELatm1LmzZt+Pbbb3MdExcXR2hoKG+99VaO+9955x0iIiJo3bo1F198Mb/99pvH73vo0CF69uxJkyZN6NmzJ4cPH3Z53COPPELLli1p3rw5I0eOxLIsjh07Rtu2bbO+atWqxahRowCYO3cutWvXznrs1VdfzfO1REREpPDS0017uZYtYflyePqp05w3/xlo3hw+/hgqVTI7zBs2wOWX+3u5BaLgXEiWZXHjjTdyxRVXkJSUxNq1a4mLi+Off/7x6ntkZmbmuv+dd97ht99+Y/jw4YwePdpr7+do6tSpbNiwgenTp3PffffleOytt95i8eLFbNmyhWeffZalS5dmPXbhhRfyww8/sHHjRh5//HGGDBni8XtOmTKF7t27s337drp3786UKVNyHbNy5Up++uknEhIS2LRpE6tXr+aHH36gSpUqWePON2zYwAUXXMBNN92U9bz+/ftnPXbPPffk+VoiIiJSOKdOwUUXwUMPmTZzSa8t44HX2hIU8yicOAG33AK//w4PPwyhof5eboEpOBfS999/T2hoaI5Q2aZNGy699NIcx2VkZDB69Gg6duxIREQEL7/8MgDHjx+ne/futG/fntatW7Nw4UIAdu7cSXh4OLfffjutWrViV45h7TlddNFF7NmzB4ATJ04wePBgOnXqRLt27bJeLzU1lX79+tGiRQtuvPFGOnfu7Lapd37vAbB06VLmzZvHV199RePGjVmyZAnjx4/P2lm++OKLqVGjBgBdunRh9+7dHr/XwoULueOOOwC44447+PTTT3MdY7PZOHnyJKdPn+bUqVOkpaVxtuOfd4Bt27bx77//5vpZFOa1REREJH/p6eZ7+fJw9dXw2Zx9fFbtNs4e0M00bG7cGBYvhg8+gPr1/bvYIig1FwdecUXu+/r1g+HDITXV/BCd3Xmn+TpwwPwC5GjZsrzfb9OmTXTo0CHfdb322mtUq1aN1atXc+rUKbp27UqvXr0477zz+OSTT6hatSoHDhygS5cu9O3bF4Dt27fz5ptv0qVLlzxfe/Hixdxwww0ATJo0iSuvvJLXX3+dlJQUOnXqRI8ePXjppZeoUaMGiYmJbNq0ibZt2+a7ZnfvAdCjRw969OiRdbtOnTr89NNPbs+9T58+WbcvvfRSjh07luu4adOm0aNHD/755x/q1q0LwDnnnONy9/6iiy6iW7du1K1bF8uyuP/++3NN1luwYAH9+/fH5lAT9dFHH7F8+XKaNm1KfHw85513nkevJSIiInlbtAjuvx/efhsu6pjOk7VegofHwdGjUKGCGQk4erT5dwlXaoJzoFqyZAkJCQl8+OGHABw5coTt27dTv359xo4dy/LlywkKCmLPnj1ZQfGCCy7IMzQPGjSI06dPc/z48awa5yVLlvDZZ58xbdo0AE6ePMlff/3FihUriIqKAqBVq1ZERER4tO7Ro0czduxYdu/ezc8//1zg8/7+++957bXXWLFiRdZ9P/74o8fPt9lsOYKv3R9//MGWLVuydrJ79uzJjz/+mGN3ecGCBTlqr6+77joGDhxI+fLlefnll7njjjv47rvvPHotERERce2ff2DUKFiwwJQvV038BYYPM7XLYK4MfP55aNjQn8v0qlITnPPaIQ4Ly/vxWrXy32F21rJly6wwnBfLsnjhhRfo3bt3jvvnzp3L/v37Wbt2LaGhoTRo0ICTJ08CUKlSpTxf85133qFDhw6MHj2aBx54gI8//hjLsvjoo48IDw8v2Im4MXXqVG655RZeeOEFBg8ezNq1az1+bkJCAvfccw+LFi2iZs2aWffnt+N89tlns3fvXurWrcvevXupU6dOrmM/+eQTunTpQuXKlQHo06cPP//8c1bY/e2330hPT8/x1wDHNdxzzz088sgjHr2WiIiIuDZvHkRFmb/qTx1zkOh/xhB8z5mL788/3wTmvn0DqiOGN6jGuZCuvPJKTp06xZw5c7LuS0hIyLWr2rt3b1566SXS0tIAU3974sQJjhw5Qp06dQgNDeX777/nzz//LND722w2nnrqKX755Rd+//13evfuzQsvvJDVFWL9+vUAdO3alffffx+AxMRENm7cmPUat99+O6tWrcrzfe6//34yMzP5+uuvPVrXX3/9xU033cRbb71F06ZNczz2448/5riAz/5lL/3o27cvb775JgBvvvkm119/fa7XP//88/nhhx9IT08nLS2NH374IUd5xfz58xk4cGCO5+zduzfr35999lnW8fm9loiIiLj2zz/QNiKTPx9/lYfnNCX4jVfNxX4xMZCYCNdfX+pCMyg4F5rNZuOTTz5h6dKlNGrUiJYtWxITE8M555yT47h77rmHFi1a0L59e1q1asXQoUNJT09n0KBBrFmzhtatWzNv3jyaNWtW4DVUrFiRhx56iKlTp/L444+TlpZGREQELVu25PHHHwdg+PDh7N+/nxYtWjBu3DhatmxJtWrVABP0zz333HzPc9y4cTzzzDMerWnChAkcPHiQ4cOH07ZtWyIjIz0+nzFjxvDNN9/QpEkTli5dypgxYwBYs2ZNVieMW265hUaNGtG6dWvatGlDmzZtuO6667Je4/33388VnJ9//nlatmxJmzZteP7555k7d65HryUiIiLGqVMwYQLY/9j+YLf1fHe6K+c8fi8cOmRaaCQkwOTJpt1cKWWzSkDj2sjIyFydILZs2aLdQQ9kZGSQlpZGhQoVSEpKokePHmzdupWTJ09y991388EHH/h7iZIH/XcuIiL+9uOPMGSI6SI3esgRnin/OMyaBZmZULeuadrcv3+p2WF2lTvtSk2Ns7iWmppKt27dSEtLw7IsXnzxRcqVK0e5cuUUmkVERMStw4dhzBiYMwcuON9i/UPv0Pbth02dRnCwuTLwySehalV/L7XYKDiXclWqVClQ32YRERERgO++g1dfhafvSOShpOEEP3tmSNjFF8OLL0KbNv5doB8oOIuIiIgIAH/9BWvXwo03wk29jrN/8FOcNfc5M+GkVi145hm44w4IKpuXySk4i4iIiJRxGRnwwgswbhyEVbS4+r+PKf/oKM7avdvULg8dai78O+ssfy/VrxScRURERMqwDRvg3nthzRq4+/I/eJ4HKD9osXmwQwd46SXo2NGvawwUCs4iIiIiZdTu3dCpE5xb4z823TyFFl88je3UKahe3ewwDxliLgQUQH2ci2T37t1cf/31NGnShIYNG3L//fdz6tQpr7/PsmXLWLlyZb7H7dy5k4oVK9K2bdusr9OnTzN37lzuv//+HMdeccUVWRcNNmjQgNatW2c9Z+TIkbleOzY2lnr16tG2bVtatGjB/PnzvXNyDubOnUvt2rVp27YtzZo1Iz4+Ptcxy5Yto3Llyll9ne02bNjARRddRMuWLYmIiOC9997z+H0ty2LkyJE0btyYiIgI1q1b5/K4+fPn07p1ayIiIrjqqqs4cOAAAP3798/67Bo0aEDbtm0BWLVqVdb9bdq04ZNPPsl6LcfPvCC9rkVERLzh99/N9/r1Ycmor0gKa0XLjyaY0HzHHbB1KwwbptDszCoBOnTokOu+xMREP6wkW2ZmptWxY0fr9ddftyzLstLT063BgwdbI0eO9Pp7jR8/3po6dWq+x+3YscNq2bJlrvvfeOMNa8SIETnuu/zyy63Vq1dblmVZF1xwgbV//36P17Bt2zarSpUq1unTpz09BY84rvPAgQNWzZo1rb/++ivr8Y0bN1rNmze3Nm7caPXr18+KjY3Nemzr1q3Wtm3bLMuyrD179ljnnHOOdfjwYY/e98svv7SuuuoqKzMz0/r555+tTp065TomLS3Nql27dtbnNHr0aGv8+PG5jnvwwQetJ5980rIsyzpx4oSVlpZmWZZl/f3331bt2rWzbnvymVuW//87FxGR0uWffyxr0CDLstksa92nf1rWDTdYFpivVq0sa/lyfy/R71zlTjvtOBfSd999R4UKFbjrrrsACA4OJj4+nnnz5nH8+PFcu7zXXnsty5YtA2DYsGFERkbSsmVLxo8fn3VMgwYNGD9+PO3bt6d169b8/vvv7Ny5k9mzZxMfH0/btm1zjfT2hyZNmhAWFsbhw4cBmDp1Kh07diQiIiLH+Tz11FOEh4dzySWXMHDgQKZNm+bxe9SsWZPGjRtnjcves2cPd999N59++imtWrXi3XffZevWrbz++usANG3alCZNmgBw7rnnUqdOHfbv3+/Rey1cuJDbb78dm81Gly5dSElJyTGmG8yutGVZnDhxAsuyOHr0aK6pi5Zl5ZhcGBYWRkiIqYY6efIktlLSGF5EREoey4I33oDmzeGT906z5MoptL21OXz6KVSuDNOmwbp1cOmluZ6bnFz86w1UpaPG2VeBJI+hips3b6ZDhw457qtatSoNGjTgjz/+yPNlJ02axFlnnUVGRgbdu3cnISGBiIgIAGrVqsW6det48cUXmTZtGq+++ir33XcflStX5uGHH853yUlJSVmlAl27dmXWrFkAvPfee6xYsSLrOOc1duvWjeAzf4654447iI6Odvse69ato0mTJtSpU4clS5awfft2Vq1ahWVZ9O3bl+XLl1OxYkU++ugjfvvtN9LS0mjfvn2uzysvf/31FydPnsz6XOrVq8evv/6a9XhwcDDvvvuuy+euWrWK06dP06hRIwCio6P5/vvvcx03YMAAxowZw549ezjvvPOy7q9fvz579uyhbt26WfeFhoby0ksv0bp1aypVqkSTJk2yPlu7H3/8kbPPPjsrwAP8+uuvDB48mD///JO33norK0jbbDZ69eqFzWZj6NChDBkyxOPPRkREpCAsC667Dr78Eh5o9T1Tqw+n/LdnajX69TOT/+rVc/ncuDgYO9aUO8fEFOOiA1TpCM4lzPvvv8+cOXNIT09n7969JCYmZgXEm266CYAOHTrw8ccfF/i1GzVqxIYNG3Ld379/f2bOnJl1+4orrsjx+Pfff0+tWrXyfO34+HjeeOMNtm3bxueffw7AkiVLWLJkCe3atQPg+PHjbN++nWPHjnH99ddToUIFKlSowHXXXefR+t977z2WL1/O77//zsyZM6lQoYJHz7Pbu3cv//vf/3jzzTcJOtNj0lWtdEGlpaXx0ksvsX79eho2bMgDDzxAXFwc48aNyzpm/vz5WbvNdp07d2bz5s1s2bKFO+64gz59+lChQgVWrFhBvXr1+Pfff+nZsyfNmjXjsssuK/I6RURE7NLSICTE7C/e0nUv0/99iMarz1yj1KSJGZvds6fb58fFwcSJ5t/272U9PBe5VGPXrl1069aNFi1a0LJlS2bMmAHAoUOH6NmzJ02aNKFnz55Zf9a3PLwQq0Cyq3O8+5WHFi1asHbt2hz3HT16lH379hEeHk5ISAiZmZlZj508eRKAHTt2MG3aNL799lsSEhK45pprsh4DKF++PGB2VNPT04v+2XhRdHQ0mzdv5qOPPuLuu+/m5MmTWJZFTEwMGzZsYMOGDfzxxx/cfffdhX6P/v37k5CQwMqVKxkzZgz79u3z+LlHjx7lmmuuYdKkSXTp0iXHuh0vmLR/TZkyBTC72bt27co6fvfu3dRz+s3b/stIo0aNsNls9OvXL8cFm+np6Xz88cf079/f5dqaN29O5cqV2bRpU9Z7AtSpU4cbb7yRVatWeXyeIiIi+fnpJ2jbFj5ckA4zZnBnXLgJzRUqmBS8caNHoTk11dxOTTW34+KKZ/2BqsjBOSQkhGeffZbExER++eUXZs2aRWJiIlOmTKF79+5s376d7t27Z4WURYsWsX37drZv386cOXMYNmxYkU/CH7p3705qairz5s0DICMjg4ceeoj777+fihUr0qBBAzZs2EBmZia7du3KCkZHjx6lUqVKVKtWjX/++YdFixbl+15VqlTh2LFjPj2fgujbty+RkZG8+eab9O7dm9dff53jx48Dphb533//pWvXrnz++eecPHmS48eP88UXX2Q9f+bMmTl2v12JjIzkf//7X9YvYvk5ffo0N954I7fffju33HJLjsfi4+Ozgr3j15gxY7LOZ968eViWxS+//EK1atVylGmACbqJiYlZddPffPMNzZs3z3p86dKlNGvWjPr162fdt2PHjqxffv78809+//13GjRowIkTJ7J+nidOnGDJkiW0atXKo/MUERHJS0qKaYZxySUQfnAlvcdFwqhRcOyYqddITITHHoMzG3WuOIdmO4VnL5Rq1K1bNytkVKlShebNm7Nnzx4WLlyYdTHcHXfcwRVXXMHTTz/t9kIs56AS6Gw2G5988gkjRozgqaeeYv/+/fTv35/HHnsMMPXFF154IS1atKB58+a0b98egDZt2tCuXTuaNWvGeeedR9euXfN9r+uuu45bbrmFhQsX8sILL3D48GHWrFnDhAkTvHY+jjXOERERWb8QuPPEE09w6623smXLFrZs2cJFF10EQOXKlXn77bfp2LEjffv2JSIigrPPPpvWrVtTrVo1AH7//XePzvvRRx+lffv2jB07lipVquR57Pvvv8/y5cs5ePAgc+fOBUx7O3u9d16uvvpqvvrqKxo3bkxYWBhvvPFG1mNt27Zlw4YNnHvuuYwfP57LLruM0NBQLrjggqz3AViwYEGuMo0VK1YwZcoUQkNDCQoK4sUXX6RWrVokJydz4403Aman+tZbb+Wqq67Kd50iIiJ5+eIL03Y5Y99+fmk5hs6bzQX0XHABPP889O2b72skJ5uaZndSU83j/ftDw4ZeWnhJ4s32HTt27LDOO+8868iRI1a1atWy7s/MzMy6fc0111g//vhj1mNXXnllVls0dwKxHZ2zn376yTr//POttWvX+nspAePYsWOWZZm2bB06dMj6bK655hrr1KlT/lxaiRFo/52LiEjgem9+hvXUeS9baVVrmKLT0FDLeuwxyzpxokCvM3myZYWFua5jDQszj5dmebWj89rFgcePH+fmm29m+vTpVK1aNcdjNputwK245syZw5w5cwA8bivmTxdffDF/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",
      "text/plain": [
       "<Figure size 864x576 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.clf()\n",
    "fig, ax = plt.subplots(1, figsize=(12,8))\n",
    "fig.patch.set_facecolor(\"white\")\n",
    "s1 = ax.scatter(x_train, y_train, c=\"blue\", marker=\"D\")\n",
    "s2 = ax.scatter(x_test, y_test, c=\"orange\", marker=\"x\")\n",
    "p1 = ax.plot(x_test, y_pred, c=\"blue\", marker=None, linestyle=\"dashed\")\n",
    "p2 = ax.plot(x_test, y_test_pred_fhe, c=\"red\", marker=None, linewidth=2)\n",
    "ax.legend([s1, s2, p1[0], p2[0]],\n",
    "    [\n",
    "        \"Train Data\",\n",
    "        \"Test Data\",\n",
    "        f\"Clear Reg, R^2={sklearn_r2:.4f}\",\n",
    "        f\"Quant. FHE Reg, R^2={homomorphic_test_error:.4f}\"\n",
    "    ]\n",
    ")\n",
    "display(fig)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c18dbdd1",
   "metadata": {},
   "source": [
    "### Enjoy!"
   ]
  }
 ],
 "metadata": {
  "execution": {
   "timeout": 10800
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
